﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using System.Collections;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;

namespace TumbaloSoft.Controllers
{
    public class RegistroMantenimientoController : TumbaloController
    {
        //
        // GET: /RegistroMantenimiento/

        private static Object lockObject = new Object();

        public ActionResult Index(BusquedaRegistroMantenimiento buscaReg,int idContrato)
        {
            try
            {
                if (defaultAction != null) return defaultAction;

                int cuenta = AccountController.getIdPersona(HttpContext);

                int permiso = AccountController.getIdPerfil(HttpContext);//administrador=0, general=1

                ViewBag.permiso = permiso;

                BusquedaRegistroMantenimiento buscaReg2 = new BusquedaRegistroMantenimiento();
                buscaReg2.prIdContrato = idContrato;
                IList registro2 = HelperRegistroMantenimiento.buscar(buscaReg2);
                List<RegistroMantenimiento> registro = new List<RegistroMantenimiento>();
                for (int i = 0; i < registro2.Count; i++)
                {

                    DateTime horaini = DateTime.Parse(((RegistroMantenimiento)registro2[i]).prHoraMantI);
                    DateTime horafi = DateTime.Parse(((RegistroMantenimiento)registro2[i]).prHoraMantF);

                    int entra = 1;

                    if (buscaReg.prHoraIMin != null)
                    {
                        if (buscaReg.prHoraIMin.Value.CompareTo(horaini) > 0) entra = 0;

                    }

                    if (buscaReg.prHoraIMax != null)
                    {
                        if (buscaReg.prHoraIMax.Value.CompareTo(horaini) < 0) entra = 0;

                    }

                    if (buscaReg.prHoraFMin != null)
                    {
                        if (buscaReg.prHoraFMin.Value.CompareTo(horafi) > 0) entra = 0;

                    }

                    if (buscaReg.prHoraFMax != null)
                    {
                        if (buscaReg.prHoraFMax.Value.CompareTo(horafi) < 0) entra = 0;

                    }

                    if (entra == 1)
                    {
                        registro.Add((RegistroMantenimiento)registro2[i]);
                    }

                }

                ViewBag.idContrato = idContrato;
                ViewBag.num = registro.Count;
                ViewBag.registro = registro;

                return View();
            }
            catch
            {
                Logger.Current.Error("Hubo un error al mostrar los mantenimientos");
                
                return View("~/Views/Shared/Error.cshtml");
            }

            
        }

        public ActionResult Registrar(int idContrato)
        {
            try
            {
                if (defaultAction != null) return defaultAction;

                int cuenta = AccountController.getIdPersona(HttpContext);

                int permiso = AccountController.getIdPerfil(HttpContext);//administrador=0, general=1

                ViewBag.permiso = permiso;


                ContratoMantenimiento contrato = HelperContratoMantenimiento.selectById(idContrato);
                if (contrato == null) return HttpNotFound("No existe el contrato con el codigo " + idContrato);

                Edificio edif = HelperEdificio.selectById(contrato.prEdificio.prIdEdificio);
                ViewBag.nombre = edif.prNombre;
                ViewBag.fechaFirma = contrato.prFechaFirma.ToShortDateString();
                ViewBag.fechaInicio = contrato.prFechaInicio.ToShortDateString();
                ViewBag.fechaFin = contrato.prFechaFin.ToShortDateString();
                ViewBag.tipo = contrato.prTipoContrato.prIdTipoContrato;
                contrato.prIdProveedor = HelperProveedor.selectById(contrato.prIdProveedor.prIdProveedor);
                contrato.prIdProveedor.prProveedorJuridico = HelperPersonaJuridica.selectById(contrato.prIdProveedor.prIdPersona);
                contrato.prIdProveedor.prProveedorNatural = HelperPersonaNatural.selectById(contrato.prIdProveedor.prIdPersona);

                if (contrato.prIdProveedor.prProveedorNatural.prNombre == null)
                {
                    ViewBag.TipoEspecial = 1;
                    ViewBag.nombreProv = contrato.prIdProveedor.prProveedorJuridico.prRazonSocial;
                }
                else
                {
                    ViewBag.TipoEspecial = 0;
                    ViewBag.nombreProv = contrato.prIdProveedor.prProveedorNatural.prNombre + " " + contrato.prIdProveedor.prProveedorNatural.prApellidoPaterno;
                }

                PersonaNatural per = HelperPersonaNatural.selectById(HelperAdministrador.IdPersona(contrato.prAdministrador.prIdAdministrador));
                per.prIdPersona = contrato.prAdministrador.prIdAdministrador;
                ViewBag.empleado = per;
                ViewBag.idContrato = idContrato;
                ViewBag.tipo = contrato.prTipoContrato.prIdTipoContrato;
                ViewBag.frecuencia = contrato.prFrecuencia;
                ViewBag.monto = contrato.prMonto;
                ViewBag.moneda = contrato.prMoneda.prDescripcion;
                ViewBag.descripcion = contrato.prDescripcion;
                return View();
            }
            catch
            {
                Logger.Current.Error("Hubo un error al registrar los mantenimientos");
                return View("~/Views/Shared/Error.cshtml");
            }
        }






        [HttpPost]
        public ActionResult Registrar(RegistroMantenimiento mantenimiento, String fechaIni, String fechaFin)
        {

            if (mantenimiento != null)
            {
                try
                {
                    if (defaultAction != null) return defaultAction;

                    int cuenta = AccountController.getIdPersona(HttpContext);

                    int permiso = AccountController.getIdPerfil(HttpContext);//administrador=0, general=1

                    ViewBag.permiso = permiso;

                    DateTime fechaF = DateTime.Parse(fechaFin);
                    DateTime fechaI = DateTime.Parse(fechaIni);

                    if (mantenimiento.prFecha == null)
                    {

                        ModelState.AddModelError("prFecha", "Debe ingresar la fecha en la que se llevo a cabo el mantenimiento");
                    }

                    // Verificar que la fecha este entee los valores del contrato
                    if (mantenimiento.prFecha.CompareTo(fechaF) > 0 || mantenimiento.prFecha.CompareTo(fechaI) < 0)
                    {
                        ModelState.AddModelError("prFecha", "La fecha debe estar entre la fecha de inicio y fin del contrato");
                    }


                    if (mantenimiento.prHoraFin == null)
                    {
                        ModelState.AddModelError("prHoraFin", "Debe ingresar la hora en la que finalizo el mantenimiento");
                    }

                    if (mantenimiento.prHoraInicio == null)
                    {
                        ModelState.AddModelError("prHoraInicio", "Debe ingresar la hora en la que empezo el mantenimiento");
                    }

                    if (mantenimiento.prHoraFin.CompareTo(mantenimiento.prHoraInicio) < 0)
                    {

                        ModelState.AddModelError("prHoraFin", "La hora de fin debe ser menor a la hora de comienzo del mantenimiento");
                    }

                    ModelState.Remove("prContrato.prDescripcion");

                    if (ModelState.IsValid)
                    {

                        mantenimiento.prHoraMantI = mantenimiento.prHoraInicio.ToShortTimeString();
                        mantenimiento.prHoraMantF = mantenimiento.prHoraFin.ToShortTimeString();

                        lock (lockObject)
                        {
                            mantenimiento.prIdRegistro = HelperRegistroMantenimiento.MaxId() + 1;

                            HelperRegistroMantenimiento.insert(mantenimiento);
                        }
                        ViewBag.mensaje = "Se creo registro el mantenimiento ";
                        ViewBag.returnURL = "/RegistroMantenimiento?idContrato=" + mantenimiento.prContrato.prIdContratoMantenimiento;
                        return View("~/Views/Shared/Exito.cshtml");
                    }
                    //Aca ira lo del Index
                    else
                    {
                        int idContrato = mantenimiento.prContrato.prIdContratoMantenimiento;
                        ContratoMantenimiento contrato = HelperContratoMantenimiento.selectById(idContrato);
                        if (contrato == null) return HttpNotFound("No existe el contrato con el codigo " + idContrato);

                        Edificio edif = HelperEdificio.selectById(contrato.prEdificio.prIdEdificio);
                        ViewBag.nombre = edif.prNombre;
                        ViewBag.fechaFirma = contrato.prFechaFirma.ToShortDateString();
                        ViewBag.fechaInicio = contrato.prFechaInicio.ToShortDateString();
                        ViewBag.fechaFin = contrato.prFechaFin.ToShortDateString();
                        ViewBag.tipo = contrato.prTipoContrato.prIdTipoContrato;
                        contrato.prIdProveedor = HelperProveedor.selectById(contrato.prIdProveedor.prIdProveedor);
                        contrato.prIdProveedor.prProveedorJuridico = HelperPersonaJuridica.selectById(contrato.prIdProveedor.prIdPersona);
                        contrato.prIdProveedor.prProveedorNatural = HelperPersonaNatural.selectById(contrato.prIdProveedor.prIdPersona);

                        if (contrato.prIdProveedor.prProveedorNatural.prNombre == null)
                        {
                            ViewBag.TipoEspecial = 1;
                            ViewBag.nombreProv = contrato.prIdProveedor.prProveedorJuridico.prRazonSocial;
                        }
                        else
                        {
                            ViewBag.TipoEspecial = 0;
                            ViewBag.nombreProv = contrato.prIdProveedor.prProveedorNatural.prNombre + " " + contrato.prIdProveedor.prProveedorNatural.prApellidoPaterno;
                        }

                        PersonaNatural per = HelperPersonaNatural.selectById(HelperAdministrador.IdPersona(contrato.prAdministrador.prIdAdministrador));
                        per.prIdPersona = contrato.prAdministrador.prIdAdministrador;
                        ViewBag.empleado = per;
                        ViewBag.idContrato = idContrato;
                        ViewBag.tipo = contrato.prTipoContrato.prIdTipoContrato;
                        ViewBag.frecuencia = contrato.prFrecuencia;
                        ViewBag.monto = contrato.prMonto;
                        ViewBag.moneda = contrato.prMoneda.prDescripcion;
                        ViewBag.descripcion = contrato.prDescripcion;
                        return View();
                    }
                }
                catch
                {
                    Logger.Current.Error("Hubo un error al mostrar los mantenimientos");
                    return View("~/Views/Shared/Error.cshtml");
                }
            }
            else
            {
                Logger.Current.Error("Hubo un error al mostrar los mantenimientos");
                return View("~/Views/Shared/Error.cshtml");
            }
        }



        public ActionResult Delete(int idMantenimiento)
        {

            try
            {
                if (defaultAction != null) return defaultAction;

                int cuenta = AccountController.getIdPersona(HttpContext);

                int permiso = AccountController.getIdPerfil(HttpContext);//administrador=0, general=1

                ViewBag.permiso = permiso;
                //ACA
                RegistroMantenimiento mantenimiento = HelperRegistroMantenimiento.selectById(idMantenimiento);
                //ACA
                ContratoMantenimiento contrato = HelperContratoMantenimiento.selectById(mantenimiento.prContrato.prIdContratoMantenimiento);
                if (contrato == null) return HttpNotFound("No existe el contrato con el codigo " + contrato.prIdContratoMantenimiento);

                Edificio edif = HelperEdificio.selectById(contrato.prEdificio.prIdEdificio);
                ViewBag.nombre = edif.prNombre;
                ViewBag.fechaFirma = contrato.prFechaFirma.ToShortDateString();
                ViewBag.fechaInicio = contrato.prFechaInicio.ToShortDateString();
                ViewBag.fechaFin = contrato.prFechaFin.ToShortDateString();
                ViewBag.tipo = contrato.prTipoContrato.prIdTipoContrato;
                contrato.prIdProveedor = HelperProveedor.selectById(contrato.prIdProveedor.prIdProveedor);
                contrato.prIdProveedor.prProveedorJuridico = HelperPersonaJuridica.selectById(contrato.prIdProveedor.prIdPersona);
                contrato.prIdProveedor.prProveedorNatural = HelperPersonaNatural.selectById(contrato.prIdProveedor.prIdPersona);

                if (contrato.prIdProveedor.prProveedorNatural.prNombre == null)
                {
                    ViewBag.TipoEspecial = 1;
                    ViewBag.nombreProv = contrato.prIdProveedor.prProveedorJuridico.prRazonSocial;
                }
                else
                {
                    ViewBag.TipoEspecial = 0;
                    ViewBag.nombreProv = contrato.prIdProveedor.prProveedorNatural.prNombre + " " + contrato.prIdProveedor.prProveedorNatural.prApellidoPaterno;
                }

                PersonaNatural per = HelperPersonaNatural.selectById(HelperAdministrador.IdPersona(contrato.prAdministrador.prIdAdministrador));
                per.prIdPersona = contrato.prAdministrador.prIdAdministrador;
                ViewBag.empleado = per;
                ViewBag.mantenimiento = mantenimiento;                
                ViewBag.tipo = contrato.prTipoContrato.prIdTipoContrato;
                ViewBag.frecuencia = contrato.prFrecuencia;
                ViewBag.monto = contrato.prMonto;
                ViewBag.moneda = contrato.prMoneda.prDescripcion;
                ViewBag.descripcion = contrato.prDescripcion;
                return View();
            }
            catch
            {
                Logger.Current.Error("Hubo un error al registrar los mantenimientos");
                return View("~/Views/Shared/Error.cshtml");
            }
                    
        }






        [HttpPost]
        public ActionResult Delete(int idMantenimiento, int idContrato)
        {
            if (defaultAction != null) return defaultAction;

            if (idMantenimiento > 0)
            {
                RegistroMantenimiento mantenimiento;

                try
                {

                    mantenimiento = HelperRegistroMantenimiento.selectById(idMantenimiento);
                }
                catch
                {
                    Logger.Current.Error("Hubo un error al eliminar los mantenimientos");
                    return View("~/Views/Shared/Error.cshtml");
                }
                lock (lockObject)
                {
                    try
                    {

                        HelperRegistroMantenimiento.delete(mantenimiento);

                    }
                    catch
                    {
                        Logger.Current.Error("Hubo un error al eliminar los mantenimientos");
                        return View("~/Views/Shared/Error.cshtml");
                    }
                }
                ViewBag.mensaje = "Se elimino el registro del mantenimiento ";
                ViewBag.returnURL = "/RegistroMantenimiento?idContrato=" + idContrato;
                return View("~/Views/Shared/Exito.cshtml");
                
            }
            else
            {

                try
                {

                    int cuenta = AccountController.getIdPersona(HttpContext);

                    int permiso = AccountController.getIdPerfil(HttpContext);//administrador=0, general=1

                    ViewBag.permiso = permiso;
                    //ACA
                    RegistroMantenimiento mantenimiento = HelperRegistroMantenimiento.selectById(idMantenimiento);
                    //ACA
                    ContratoMantenimiento contrato = HelperContratoMantenimiento.selectById(mantenimiento.prContrato.prIdContratoMantenimiento);
                    if (contrato == null) return HttpNotFound("No existe el contrato con el codigo " + contrato.prIdContratoMantenimiento);

                    Edificio edif = HelperEdificio.selectById(contrato.prEdificio.prIdEdificio);
                    ViewBag.nombre = edif.prNombre;
                    ViewBag.fechaFirma = contrato.prFechaFirma.ToShortDateString();
                    ViewBag.fechaInicio = contrato.prFechaInicio.ToShortDateString();
                    ViewBag.fechaFin = contrato.prFechaFin.ToShortDateString();
                    ViewBag.tipo = contrato.prTipoContrato.prIdTipoContrato;
                    contrato.prIdProveedor = HelperProveedor.selectById(contrato.prIdProveedor.prIdProveedor);
                    contrato.prIdProveedor.prProveedorJuridico = HelperPersonaJuridica.selectById(contrato.prIdProveedor.prIdPersona);
                    contrato.prIdProveedor.prProveedorNatural = HelperPersonaNatural.selectById(contrato.prIdProveedor.prIdPersona);

                    if (contrato.prIdProveedor.prProveedorNatural.prNombre == null)
                    {
                        ViewBag.TipoEspecial = 1;
                        ViewBag.nombreProv = contrato.prIdProveedor.prProveedorJuridico.prRazonSocial;
                    }
                    else
                    {
                        ViewBag.TipoEspecial = 0;
                        ViewBag.nombreProv = contrato.prIdProveedor.prProveedorNatural.prNombre + " " + contrato.prIdProveedor.prProveedorNatural.prApellidoPaterno;
                    }

                    PersonaNatural per = HelperPersonaNatural.selectById(HelperAdministrador.IdPersona(contrato.prAdministrador.prIdAdministrador));
                    per.prIdPersona = contrato.prAdministrador.prIdAdministrador;
                    ViewBag.empleado = per;
                    ViewBag.mantenimiento = mantenimiento;                
                    ViewBag.tipo = contrato.prTipoContrato.prIdTipoContrato;
                    ViewBag.frecuencia = contrato.prFrecuencia;
                    ViewBag.monto = contrato.prMonto;
                    ViewBag.moneda = contrato.prMoneda.prDescripcion;
                    ViewBag.descripcion = contrato.prDescripcion;
                    return View();
                }
                catch
                {
                    Logger.Current.Error("Hubo un error al eliminar los mantenimientos");
                    return View("~/Views/Shared/Error.cshtml");
                }
            }

        }


    }
}
